package cn.kgc.spring04.proxy;

import cn.kgc.spring04.interfce.Teacher;
import cn.kgc.spring04.interfce.impl.TeacherA;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import java.util.Arrays;
import java.util.List;

/**
 * @Author: 课工场
 * @Version: v1.0  2023/2/20
 * @Description: 基于JDK的代理工具类
 */
public class DynamicProxy {

    //被代理的对象
    private Object target;

    public DynamicProxy(Object obj){
        this.target = obj;
    }

    // 生成代理对象
    public  Object getProxy(){

        /**
         *target  - > targetProxy    jdk
         *
         *@param   ClassLoader  loader    类加载器     the class loader to define the proxy class
         *                       jvm虚拟机不会为动态代理类分配类加载器  借用类加载器
         *@param   interfaces   被代理对象实现的接口  数组    the list of interfaces for the proxy class to implement
         *                       jdk基于接口的代理
         * InvocationHandler   增强功能代码编写的位置
         */

        // 获取类加载器
        ClassLoader classLoader = target.getClass().getClassLoader();
        // 获取被代理对象实现的所有的接口
        Class<?>[] interfaces = target.getClass().getInterfaces();

        /**
         * InvocationHandler  invocationHandler
         * Object  proxy     代理对象
         * Method  method    被代理对象的方法
         * Object[] args     被代理对象的方法调用时 传入的参数
         */

        InvocationHandler  invocationHandler = (proxy,method,args)->{


            Object invoke = null;
            try {
                // 增强的功能
                System.out.println(args[0]+"课程上课时间到了");
                // 通过反射执行目标方法
                invoke = method.invoke(target, args);
                // 增强的功能
                System.out.println(args[0]+"课程下课时间到了");

            }catch (Exception e){


            }finally {


            }



            return invoke;
        };

        //InvocationHandler invocationHandler = new InvocationHandler() {
        //    @Override
        //    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        //
        //            //System.out.println();
        //            // 增强的功能
        //            System.out.println(args[0]);
        //            // 通过反射执行目标方法
        //            Object invoke = method.invoke(target, args);
        //            // 增强的功能
        //            //System.out.println("课程下课时间到了"+args[0]);
        //            return invoke;
        //    }
        //};

        // 获取代理对象
        Object o = Proxy.newProxyInstance(classLoader,interfaces,invocationHandler);

        return  o;
    }
}
